package com.linzm.leetcode.primary.exercises3_20230122;

/**
 * @Author zimingl
 * @Date 2023/1/25 0:23
 * @Description: 整数除法
 */
public class Demo20 {
    /**
     * 给定两个整数 a 和 b ，求它们的除法的商 a/b ，要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。
     * 整数除法的结果应当截去（truncate）其小数部分，例如：truncate(8.345) = 8 以及 truncate(-2.7335) = -2
     * 假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−231, 231−1]。本题中，如果除法结果溢出，则返回 231 − 1
     * 输入：a = 15, b = 2
     * 输出：7
     * 解释：15/2 = truncate(7.5) = 7
     * 输入：a = 7, b = -3
     * 输出：-2
     * 解释：7/-3 = truncate(-2.33333..) = -2
     */
    public static void main(String[] args) {
        Demo20 demo20 = new Demo20();
        int a = -2147483648, b = 2;
        int divide = demo20.divide(a, b);
        System.out.println(divide);
    }


    private int divide2(int a, int b) {
        if (a == Integer.MIN_VALUE && b == -1) {
            return Integer.MAX_VALUE;
        }
        return a / b;
    }

    private int divide(int a, int b) {
        // a = -2147483648, b = 1;  -2147483648
        // a = -2147483648, b = -1;  2147483647
        // a = -2147483648, b = 2;  -1073741824
        // a = -2147483648, b = -2;  1073741824
        if (a == Integer.MIN_VALUE && b == -1) {
            return Integer.MAX_VALUE;
        }
        if (a == Integer.MIN_VALUE && b == 1) {
            return Integer.MIN_VALUE;
        }
        if (a == Integer.MIN_VALUE && b == 2) {
            return -(Integer.MAX_VALUE / 2) - 1;
        }
        int x = 0, y = 0, flag = 0, count = 0;
        if (a < 0) {
                x = -a;
                flag++;
        } else {
            x = a;
        }
        if (b < 0) {
                y = -b;
                flag++;
        } else {
            y = b;
        }
        while (x > 0) {
            x = x - y;
            count++;
        }
        if (x == 0 && flag % 2 == 0) {
            return count;
        }
        if (x == 0 && flag % 2 != 0) {
            return -count;
        }
        if (flag % 2 == 0) {
            return count - 1;
        }
        return 1 - count;
    }
}
